//java模拟挖矿  方法一
//
//        import java.security.MessageDigest;
//
//public class Main {
//
//    public static void main(String[] args) {
//
//        for(int i=0;i<10000000;i++) {
//  //确定随机数范围
//            String h=getSHA256Hash(i+"");
//            //字符串  //用h 代替                //整数和字符串组合得到字符串可以求hash
//            //System.out.println(i+"="+h);
//
//            if (isHashValid(h,3))
//
//                System.out.println(i+"="+h);
//
//        }
//
//    }
//
//    public static boolean isHashValid(String hash, int difficulty) {
//                            //是有效的hash值
//        String prefix = repeat("0", difficulty);
//
//        return hash.startsWith(prefix);
//                                //前缀是否是3个0      //返回离得最近的函数
//    }
//
//    private static String repeat(String str, int repeat) {
//
//        final StringBuilder buf = new StringBuilder();
//               //给其申请一个新的空间存储数据                         //缓冲区
//        for (int i = 0; i < repeat; i++) {
////重复前面难度系数3个0
//            buf.append(str);
//
//        }
//
//        return buf.toString();
//
//    }
//
//    public static String getSHA256Hash(String input) {
//                                                //对应第一个函数中input i
//
//        try {
//
//            MessageDigest sha256 = MessageDigest.getInstance("SHA-256");
//
//
//            byte[] hash = sha256.digest(input.getBytes("UTF-8"));
//
//
//            StringBuilder hexString = new StringBuilder();
//
//
//
//            for (byte b : hash) {
//
//
//                String hex = Integer.toHexString(0xff & b);
//
//
//                if (hex.length() == 1) hexString.append('0');
//
//
//                hexString.append(hex);
//
//
//            }
//
//
//            return hexString.toString();
//
//
//        } catch (Exception e) {
//
//
//            throw new RuntimeException(e);
//
//
//        }
//
//
//
//    }
//
//}



//Java模拟挖矿 方法二

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import java.util.Collections;



public class Main {

    // 假设的挖矿难度

    private static final int DIFFICULTY_TARGET = 4;



    // 挖矿函数

    public static String mineBlock(String lastHash, String data) {

        String nonce = "0000"; // 初始 nonce 值

        String hash = "    ";



        while (!hash.substring(0, DIFFICULTY_TARGET).equals(String.join("", Collections.nCopies(DIFFICULTY_TARGET, "0")))) {

            hash = calculateHash(lastHash, nonce, data);

            nonce = String.format("%04d", Integer.parseInt(nonce) + 1); // 递增 nonce

        }



        return hash;

    }



    // 计算哈希值

    private static String calculateHash(String lastHash, String nonce, String data) {

        String toHash = lastHash + nonce + data;

        try {

            MessageDigest digest = MessageDigest.getInstance("SHA-256");

            byte[] hashedBytes = digest.digest(toHash.getBytes());

            return bytesToHex(hashedBytes);

        } catch (NoSuchAlgorithmException e) {

            throw new RuntimeException(e);

        }

    }



    // 字节转换为十六进制字符串

    private static String bytesToHex(byte[] bytes) {

        StringBuilder hexString = new StringBuilder();

        for (byte b : bytes) {

            String hex = Integer.toHexString(0xff & b);

            if (hex.length() == 1) hexString.append('0');

            hexString.append(hex);

        }

        return hexString.toString();

    }



    public static void main(String[] args) {

        String lastHash = "fooHash"; // 假设的前一个区块的哈希值

        String data = "barData"; // 假设的区块数据

        String hash = mineBlock(lastHash, data);

        System.out.println("Block mined! Hash: " + hash);

    }



}

// 我添加了一条注释
